home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / Numeric / Numeric.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2006-03-29  |  31KB  |  905 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''Numeric module defining a multi-dimensional array and useful procedures for
  5.    Numerical computation.
  6.  
  7. Functions
  8.  
  9. -   array                      - NumPy Array construction
  10. -   zeros                      - Return an array of all zeros
  11. -   empty                      - Return an unitialized array (200x faster than zeros)
  12. -   shape                      - Return shape of sequence or array
  13. -   rank                       - Return number of dimensions
  14. -   size                       - Return number of elements in entire array or a
  15.                                  certain dimension
  16. -   fromstring                 - Construct array from (byte) string
  17. -   take                       - Select sub-arrays using sequence of indices
  18. -   put                        - Set sub-arrays using sequence of 1-D indices
  19. -   putmask                    - Set portion of arrays using a mask 
  20. -   reshape                    - Return array with new shape
  21. -   repeat                     - Repeat elements of array
  22. -   choose                     - Construct new array from indexed array tuple
  23. -   cross_correlate            - Correlate two 1-d arrays
  24. -   searchsorted               - Search for element in 1-d array
  25. -   sum                        - Total sum over a specified dimension
  26. -   average                    - Average, possibly weighted, over axis or array.
  27. -   cumsum                     - Cumulative sum over a specified dimension
  28. -   product                    - Total product over a specified dimension
  29. -   cumproduct                 - Cumulative product over a specified dimension
  30. -   alltrue                    - Logical and over an entire axis
  31. -   sometrue                   - Logical or over an entire axis
  32. -   allclose\t\t       - Tests if sequences are essentially equal
  33.  
  34. More Functions:
  35.  
  36. -   arrayrange (arange)        - Return regularly spaced array
  37. -   asarray                    - Guarantee NumPy array
  38. -   sarray                     - Guarantee a NumPy array that keeps precision 
  39. -   convolve                   - Convolve two 1-d arrays
  40. -   swapaxes                   - Exchange axes
  41. -   concatenate                - Join arrays together
  42. -   transpose                  - Permute axes
  43. -   sort                       - Sort elements of array
  44. -   argsort                    - Indices of sorted array
  45. -   argmax                     - Index of largest value                      
  46. -   argmin                     - Index of smallest value
  47. -   innerproduct               - Innerproduct of two arrays
  48. -   dot                        - Dot product (matrix multiplication)
  49. -   outerproduct               - Outerproduct of two arrays
  50. -   resize                     - Return array with arbitrary new shape
  51. -   indices                    - Tuple of indices
  52. -   fromfunction               - Construct array from universal function
  53. -   diagonal                   - Return diagonal array
  54. -   trace                      - Trace of array
  55. -   dump                       - Dump array to file object (pickle)
  56. -   dumps                      - Return pickled string representing data
  57. -   load                       - Return array stored in file object
  58. -   loads                      - Return array from pickled string
  59. -   ravel                      - Return array as 1-D 
  60. -   nonzero                    - Indices of nonzero elements for 1-D array
  61. -   shape                      - Shape of array
  62. -   where                      - Construct array from binary result
  63. -   compress                   - Elements of array where condition is true
  64. -   clip                       - Clip array between two values
  65. -   ones                       - Array of all ones
  66. -   identity                   - 2-D identity array (matrix)
  67.  
  68. (Universal) Math Functions 
  69.  
  70.        add                    logical_or             exp        
  71.        subtract               logical_xor            log        
  72.        multiply               logical_not            log10      
  73.        divide                 maximum                sin        
  74.        divide_safe            minimum                sinh       
  75.        conjugate              bitwise_and            sqrt       
  76.        power                  bitwise_or             tan        
  77.        absolute               bitwise_xor            tanh       
  78.        negative               invert                 ceil       
  79.        greater                left_shift             fabs       
  80.        greater_equal          right_shift            floor      
  81.        less                   arccos                 arctan2    
  82.        less_equal             arcsin                 fmod       
  83.        equal                  arctan                 hypot      
  84.        not_equal              cos                    around     
  85.        logical_and            cosh                   sign
  86.        arccosh                arcsinh                arctanh
  87.  
  88. '''
  89. import numeric_version
  90. __version__ = numeric_version.version
  91. del numeric_version
  92. import multiarray
  93. from umath import *
  94. from Precision import *
  95. import _numpy
  96. import string
  97. import types
  98. import math
  99. NewAxis = None
  100. arrayrange = multiarray.arange
  101. array = multiarray.array
  102. zeros = multiarray.zeros
  103. empty = multiarray.empty
  104.  
  105. def asarray(a, typecode = None, savespace = 0):
  106.     '''asarray(a,typecode=None) returns a as a NumPy array.  Unlike array(),
  107.     no copy is performed if a is already an array.
  108.     '''
  109.     return multiarray.array(a, typecode, copy = 0, savespace = savespace)
  110.  
  111.  
  112. def sarray(a, typecode = None, copy = 0):
  113.     '''sarray(a, typecode=None, copy=0) calls array with savespace=1.'''
  114.     return multiarray.array(a, typecode, copy, savespace = 1)
  115.  
  116. fromstring = multiarray.fromstring
  117. take = multiarray.take
  118. reshape = multiarray.reshape
  119. choose = multiarray.choose
  120. cross_correlate = multiarray.cross_correlate
  121.  
  122. def repeat(a, repeats, axis = 0):
  123.     '''repeat elements of a repeats times along axis
  124.        repeats is a sequence of length a.shape[axis]
  125.        telling how many times to repeat each element.
  126.        If repeats is an integer, it is interpreted as
  127.        a tuple of length a.shape[axis] containing repeats.
  128.        The argument a can be anything array(a) will accept.
  129.     '''
  130.     a = array(a, copy = 0)
  131.     s = a.shape
  132.     if isinstance(repeats, types.IntType):
  133.         repeats = tuple([
  134.             repeats] * s[axis])
  135.     
  136.     if len(repeats) != s[axis]:
  137.         raise ValueError, 'repeat requires second argument integer or of length of a.shape[axis].'
  138.     
  139.     d = multiarray.repeat(a, repeats, axis)
  140.     return d
  141.  
  142.  
  143. def put(a, ind, v):
  144.     '''put(a, ind, v) results in a[n] = v[n] for all n in ind
  145.        If v is shorter than mask it will be repeated as necessary.
  146.        In particular v can be a scalar or length 1 array.
  147.        The routine put is the equivalent of the following (although the loop 
  148.        is in C for speed): 
  149.  
  150.            ind = array(indices, copy=0) 
  151.            v = array(values, copy=0).astype(a, typecode()) 
  152.            for i in ind: a.flat[i] = v[i] 
  153.        a must be a contiguous Numeric array.
  154.     '''
  155.     multiarray.put(a, ind, array(v, copy = 0).astype(a.typecode()))
  156.  
  157.  
  158. def putmask(a, mask, v):
  159.     '''putmask(a, mask, v) results in a = v for all places mask is true.
  160.        If v is shorter than mask it will be repeated as necessary.
  161.        In particular v can be a scalar or length 1 array.
  162.     '''
  163.     tc = a.typecode()
  164.     mask = asarray(mask).astype(Int)
  165.     v = array(v, copy = 0).astype(tc)
  166.     if tc == PyObject:
  167.         if v.shape == ():
  168.             v.shape = (1,)
  169.         
  170.         ax = ravel(a)
  171.         mx = ravel(mask)
  172.         vx = ravel(v)
  173.         vx = resize(vx, ax.shape)
  174.         for i in range(len(ax)):
  175.             if mx[i]:
  176.                 ax[i] = vx[i]
  177.                 continue
  178.         
  179.     else:
  180.         multiarray.putmask(a, mask, v)
  181.  
  182.  
  183. def convolve(a, v, mode = 2):
  184.     '''Returns the discrete, linear convolution of 1-D
  185.     sequences a and v; mode can be 0 (valid), 1 (same), or 2 (full)
  186.     to specify size of the resulting sequence.
  187.     '''
  188.     if len(v) > len(a):
  189.         temp = a
  190.         a = v
  191.         v = temp
  192.         del temp
  193.     
  194.     return cross_correlate(a, asarray(v)[::-1], mode)
  195.  
  196. ArrayType = multiarray.arraytype
  197. UfuncType = type(sin)
  198.  
  199. def swapaxes(a, axis1, axis2):
  200.     '''swapaxes(a, axis1, axis2) returns array a with axis1 and axis2
  201.     interchanged.
  202.     '''
  203.     a = array(a, copy = 0)
  204.     n = len(a.shape)
  205.     if n <= 1:
  206.         return a
  207.     
  208.     if axis1 < 0:
  209.         axis1 += n
  210.     
  211.     if axis2 < 0:
  212.         axis2 += n
  213.     
  214.     if axis1 < 0 or axis1 >= n:
  215.         raise ValueError, 'Bad axis1 argument to swapaxes.'
  216.     
  217.     if axis2 < 0 or axis2 >= n:
  218.         raise ValueError, 'Bad axis2 argument to swapaxes.'
  219.     
  220.     new_axes = arange(n)
  221.     new_axes[axis1] = axis2
  222.     new_axes[axis2] = axis1
  223.     return multiarray.transpose(a, new_axes)
  224.  
  225. arraytype = multiarray.arraytype
  226.  
  227. def concatenate(a, axis = 0):
  228.     '''concatenate(a, axis=0) joins the tuple of sequences in a into a single
  229.     NumPy array.
  230.     '''
  231.     if axis == 0:
  232.         return multiarray.concatenate(a)
  233.     else:
  234.         new_list = []
  235.         for m in a:
  236.             new_list.append(swapaxes(m, axis, 0))
  237.         
  238.     return swapaxes(multiarray.concatenate(new_list), axis, 0)
  239.  
  240.  
  241. def transpose(a, axes = None):
  242.     '''transpose(a, axes=None) returns array with dimensions permuted
  243.     according to axes.  If axes is None (default) returns array with
  244.     dimensions reversed.
  245.     '''
  246.     return multiarray.transpose(a, axes)
  247.  
  248.  
  249. def sort(a, axis = -1):
  250.     '''sort(a,axis=-1) returns array with elements sorted along given axis.
  251.     '''
  252.     a = array(a, copy = 0)
  253.     n = len(a.shape)
  254.     if axis < 0:
  255.         axis += n
  256.     
  257.     if axis < 0 or axis >= n:
  258.         raise ValueError, 'sort axis argument out of bounds'
  259.     
  260.     if axis != n - 1:
  261.         a = swapaxes(a, axis, n - 1)
  262.     
  263.     s = multiarray.sort(a)
  264.     if axis != n - 1:
  265.         s = swapaxes(s, axis, -1)
  266.     
  267.     return s
  268.  
  269.  
  270. def argsort(a, axis = -1):
  271.     '''argsort(a,axis=-1) return the indices into a of the sorted array
  272.     along the given axis, so that take(a,result,axis) is the sorted array.
  273.     '''
  274.     a = array(a, copy = 0)
  275.     n = len(a.shape)
  276.     if axis < 0:
  277.         axis += n
  278.     
  279.     if axis < 0 or axis >= n:
  280.         raise ValueError, 'argsort axis argument out of bounds'
  281.     
  282.     if axis != n - 1:
  283.         a = swapaxes(a, axis, n - 1)
  284.     
  285.     s = multiarray.argsort(a)
  286.     if axis != n - 1:
  287.         s = swapaxes(s, axis, -1)
  288.     
  289.     return s
  290.  
  291.  
  292. def argmax(a, axis = -1):
  293.     '''argmax(a,axis=-1) returns the indices to the maximum value of the
  294.     1-D arrays along the given axis.    
  295.     '''
  296.     a = array(a, copy = 0)
  297.     n = len(a.shape)
  298.     if axis < 0:
  299.         axis += n
  300.     
  301.     if axis < 0 or axis >= n:
  302.         raise ValueError, 'argmax axis argument out of bounds'
  303.     
  304.     if axis != n - 1:
  305.         a = swapaxes(a, axis, n - 1)
  306.     
  307.     s = multiarray.argmax(a)
  308.     if axis != n - 1:
  309.         s = swapaxes(s, axis, -1)
  310.     
  311.     return s
  312.  
  313.  
  314. def argmin(a, axis = -1):
  315.     '''argmin(a,axis=-1) returns the indices to the minimum value of the
  316.     1-D arrays along the given axis.    
  317.     '''
  318.     arra = array(a, copy = 0)
  319.     type = arra.typecode()
  320.     num = array(0, type)
  321.     if type in [
  322.         'bwu']:
  323.         num = -array(1, type)
  324.     
  325.     a = num - arra
  326.     n = len(a.shape)
  327.     if axis < 0:
  328.         axis += n
  329.     
  330.     if axis < 0 or axis >= n:
  331.         raise ValueError, 'argmin axis argument out of bounds'
  332.     
  333.     if axis != n - 1:
  334.         a = swapaxes(a, axis, n - 1)
  335.     
  336.     s = multiarray.argmax(a)
  337.     if axis != n - 1:
  338.         s = swapaxes(s, axis, -1)
  339.     
  340.     return s
  341.  
  342. searchsorted = multiarray.binarysearch
  343.  
  344. def innerproduct(a, b):
  345.     '''innerproduct(a,b) returns the dot product of two arrays, which has
  346.     shape a.shape[:-1] + b.shape[:-1] with elements computed by summing the
  347.     product of the elements from the last dimensions of a and b.
  348.     '''
  349.     
  350.     try:
  351.         return multiarray.innerproduct(a, b)
  352.     except TypeError:
  353.         detail = None
  354.         raise None, TypeError if array(a).shape == () or array(b).shape == () else 'invalid types for dot'
  355.  
  356.  
  357.  
  358. def outerproduct(a, b):
  359.     '''outerproduct(a,b) returns the outer product of two vectors.
  360.       result(i,j) = a(i)*b(j) when a and b are vectors
  361.       Will accept any arguments that can be made into vectors.
  362.    '''
  363.     return array(a).flat[(:, NewAxis)] * array(b).flat[(NewAxis, :)]
  364.  
  365.  
  366. def dot(a, b):
  367.     '''dot(a,b) returns matrix-multiplication between a and b.  The product-sum
  368.     is over the last dimension of a and the second-to-last dimension of b.
  369.     '''
  370.     
  371.     try:
  372.         return multiarray.matrixproduct(a, b)
  373.     except TypeError:
  374.         detail = None
  375.         raise None, TypeError if array(a).shape == () or array(b).shape == () else 'invalid types for dot'
  376.  
  377.  
  378.  
  379. def vdot(a, b):
  380.     '''Returns the dot product of 2 vectors (or anything that can be made into
  381.        a vector). NB: this is not the same as `dot`, as it takes the conjugate
  382.        of its first argument if complex and always returns a scalar.'''
  383.     return multiarray.matrixproduct(conjugate(ravel(a)), ravel(b))
  384.  
  385.  
  386. try:
  387.     from dotblas import dot, innerproduct, vdot
  388. except ImportError:
  389.     pass
  390.  
  391. matrixmultiply = dot
  392. from ArrayPrinter import array2string
  393.  
  394. def array_repr(a, max_line_width = None, precision = None, suppress_small = None):
  395.     return array2string(a, max_line_width, precision, suppress_small, ', ', 1)
  396.  
  397.  
  398. def array_str(a, max_line_width = None, precision = None, suppress_small = None):
  399.     return array2string(a, max_line_width, precision, suppress_small, ' ', 0)
  400.  
  401. multiarray.set_string_function(array_str, 0)
  402. multiarray.set_string_function(array_repr, 1)
  403. LittleEndian = fromstring('\x01' + '\x00' * 7, 'i')[0] == 1
  404.  
  405. def resize(a, new_shape):
  406.     """resize(a,new_shape) returns a new array with the specified shape.
  407.     The original array's total size can be any size.
  408.     """
  409.     a = ravel(a)
  410.     if not len(a):
  411.         return zeros(new_shape, a.typecode())
  412.     
  413.     total_size = multiply.reduce(new_shape)
  414.     n_copies = int(total_size / len(a))
  415.     extra = total_size % len(a)
  416.     if extra != 0:
  417.         n_copies = n_copies + 1
  418.         extra = len(a) - extra
  419.     
  420.     a = concatenate((a,) * n_copies)
  421.     if extra > 0:
  422.         a = a[:-extra]
  423.     
  424.     return reshape(a, new_shape)
  425.  
  426.  
  427. def indices(dimensions, typecode = None):
  428.     '''indices(dimensions,typecode=None) returns an array representing a grid
  429.     of indices with row-only, and column-only variation.
  430.     '''
  431.     tmp = ones(dimensions, typecode)
  432.     lst = []
  433.     for i in range(len(dimensions)):
  434.         lst.append(add.accumulate(tmp, i) - 1)
  435.     
  436.     return array(lst)
  437.  
  438.  
  439. def fromfunction(function, dimensions):
  440.     '''fromfunction(function, dimensions) returns an array constructed by
  441.     calling function on a tuple of number grids.  The function should
  442.     accept as many arguments as there are dimensions which is a list of
  443.     numbers indicating the length of the desired output for each axis.
  444.     '''
  445.     return apply(function, tuple(indices(dimensions)))
  446.  
  447.  
  448. def diagonal(a, offset = 0, axis1 = 0, axis2 = 1):
  449.     '''diagonal(a, offset=0, axis1=0, axis2=1) returns the given diagonals
  450.     defined by the last two dimensions of the array.
  451.     '''
  452.     a = array(a)
  453.     if axis2 < axis1:
  454.         axis1 = axis2
  455.         axis2 = axis1
  456.     
  457.     if axis2 > 1:
  458.         new_axes = range(len(a.shape))
  459.         del new_axes[axis2]
  460.         del new_axes[axis1]
  461.         new_axes[0:0] = [
  462.             axis1,
  463.             axis2]
  464.         a = transpose(a, new_axes)
  465.     
  466.     s = a.shape
  467.     if len(s) == 2:
  468.         n1 = s[0]
  469.         n2 = s[1]
  470.         n = n1 * n2
  471.         s = (n,)
  472.         a = reshape(a, s)
  473.         if offset < 0:
  474.             return take(a, range(-n2 * offset, min(n2, n1 + offset) * (n2 + 1) - n2 * offset, n2 + 1), 0)
  475.         else:
  476.             return take(a, range(offset, min(n1, n2 - offset) * (n2 + 1) + offset, n2 + 1), 0)
  477.     else:
  478.         my_diagonal = []
  479.         for i in range(s[0]):
  480.             my_diagonal.append(diagonal(a[i], offset))
  481.         
  482.         return array(my_diagonal)
  483.  
  484.  
  485. def trace(a, offset = 0, axis1 = 0, axis2 = 1):
  486.     '''trace(a,offset=0, axis1=0, axis2=1) returns the sum along diagonals
  487.     (defined by the last two dimenions) of the array.
  488.     '''
  489.     return add.reduce(diagonal(a, offset, axis1, axis2))
  490.  
  491.  
  492. def DumpArray(m, fp):
  493.     if m.typecode() == 'O':
  494.         raise TypeError, "Numeric Pickler can't pickle arrays of Objects"
  495.     
  496.     s = m.shape
  497.     if LittleEndian:
  498.         endian = 'L'
  499.     else:
  500.         endian = 'B'
  501.     fp.write('A%s%s%d ' % (m.typecode(), endian, m.itemsize()))
  502.     for d in s:
  503.         fp.write('%d ' % d)
  504.     
  505.     fp.write('\n')
  506.     fp.write(m.tostring())
  507.  
  508.  
  509. def LoadArray(fp):
  510.     ln = string.split(fp.readline())
  511.     if ln[0][0] == 'A':
  512.         ln[0] = ln[0][1:]
  513.     
  514.     typecode = ln[0][0]
  515.     endian = ln[0][1]
  516.     shape = map((lambda x: string.atoi(x)), ln[1:])
  517.     itemsize = string.atoi(ln[0][2:])
  518.     sz = reduce(multiply, shape) * itemsize
  519.     data = fp.read(sz)
  520.     m = fromstring(data, typecode)
  521.     m = reshape(m, shape)
  522.     if (LittleEndian or endian == 'B' or not LittleEndian) and endian == 'L':
  523.         return m.byteswapped()
  524.     else:
  525.         return m
  526.  
  527. import pickle
  528. import copy
  529.  
  530. class Unpickler(pickle.Unpickler):
  531.     
  532.     def load_array(self):
  533.         self.stack.append(LoadArray(self))
  534.  
  535.     dispatch = copy.copy(pickle.Unpickler.dispatch)
  536.     dispatch['A'] = load_array
  537.  
  538.  
  539. class Pickler(pickle.Pickler):
  540.     
  541.     def save_array(self, object):
  542.         DumpArray(object, self)
  543.  
  544.     dispatch = copy.copy(pickle.Pickler.dispatch)
  545.     dispatch[ArrayType] = save_array
  546.  
  547. from StringIO import StringIO
  548.  
  549. def dump(object, file):
  550.     '''dump(object, file) pickles (binary-writes) the object to an open file.
  551.     '''
  552.     Pickler(file).dump(object)
  553.  
  554.  
  555. def dumps(object):
  556.     '''dumps(object) pickles (binary-writes) the object and returns the byte
  557.     stream.
  558.     '''
  559.     file = StringIO()
  560.     Pickler(file).dump(object)
  561.     return file.getvalue()
  562.  
  563.  
  564. def load(file):
  565.     '''load(file) returns an array from the open file pointing to pickled data. 
  566.     '''
  567.     return Unpickler(file).load()
  568.  
  569.  
  570. def loads(str):
  571.     '''loads(str) returns an array from a byte stream containing its pickled
  572.     representation.
  573.     '''
  574.     file = StringIO(str)
  575.     return Unpickler(file).load()
  576.  
  577. import copy_reg
  578.  
  579. def array_constructor(shape, typecode, thestr, Endian = LittleEndian):
  580.     x = fromstring(thestr, typecode)
  581.     x.shape = shape
  582.     if LittleEndian != Endian:
  583.         return x.byteswapped()
  584.     else:
  585.         return x
  586.  
  587.  
  588. def pickle_array(a):
  589.     return (array_constructor, (a.shape, a.typecode(), a.tostring(), LittleEndian))
  590.  
  591. copy_reg.pickle(ArrayType, pickle_array, array_constructor)
  592.  
  593. def ravel(m):
  594.     """ravel(m) returns a 1d array corresponding to all the elements of it's
  595.     argument.
  596.     """
  597.     return reshape(m, (-1,))
  598.  
  599.  
  600. def nonzero(a):
  601.     '''nonzero(a) returns the indices of the elements of a which are not zero,
  602.     a must be 1d
  603.     '''
  604.     return repeat(arange(len(a)), not_equal(a, 0))
  605.  
  606.  
  607. def shape(a):
  608.     '''shape(a) returns the shape of a (as a function call which
  609.        also works on nested sequences).
  610.     '''
  611.     return asarray(a).shape
  612.  
  613.  
  614. def where(condition, x, y):
  615.     '''where(condition,x,y) is shaped like condition and has elements of x and
  616.     y where condition is respectively true or false.
  617.     '''
  618.     return choose(not_equal(condition, 0), (y, x))
  619.  
  620.  
  621. def compress(condition, m, axis = -1):
  622.     '''compress(condition, x, axis=-1) = those elements of x corresponding 
  623.     to those elements of condition that are "true".  condition must be the
  624.     same size as the given dimension of x.'''
  625.     return take(m, nonzero(condition), axis)
  626.  
  627.  
  628. def clip(m, m_min, m_max):
  629.     '''clip(m, m_min, m_max) = every entry in m that is less than m_min is
  630.     replaced by m_min, and every entry greater than m_max is replaced by
  631.     m_max.
  632.     '''
  633.     selector = less(m, m_min) + 2 * greater(m, m_max)
  634.     return choose(selector, (m, m_min, m_max))
  635.  
  636.  
  637. def ones(shape, typecode = 'l', savespace = 0):
  638.     '''ones(shape, typecode=Int, savespace=0) returns an array of the given
  639.     dimensions which is initialized to all ones. 
  640.     '''
  641.     a = zeros(shape, typecode, savespace)
  642.     a[...] = 1
  643.     return a
  644.  
  645.  
  646. def identity(n, typecode = 'l'):
  647.     '''identity(n) returns the identity matrix of shape n x n.
  648.     '''
  649.     return resize(array([
  650.         1] + n * [
  651.         0], typecode = typecode), (n, n))
  652.  
  653.  
  654. def sum(x, axis = 0):
  655.     '''Sum the array over the given axis.
  656.     '''
  657.     x = array(x, copy = 0)
  658.     n = len(x.shape)
  659.     if axis < 0:
  660.         axis += n
  661.     
  662.     if n == 0 and axis in [
  663.         0,
  664.         -1]:
  665.         return x[0]
  666.     
  667.     if axis < 0 or axis >= n:
  668.         raise ValueError, 'Improper axis argument to sum.'
  669.     
  670.     return add.reduce(x, axis)
  671.  
  672.  
  673. def product(x, axis = 0):
  674.     '''Product of the array elements over the given axis.'''
  675.     x = array(x, copy = 0)
  676.     n = len(x.shape)
  677.     if axis < 0:
  678.         axis += n
  679.     
  680.     if n == 0 and axis in [
  681.         0,
  682.         -1]:
  683.         return x[0]
  684.     
  685.     if axis < 0 or axis >= n:
  686.         return (ValueError, 'Improper axis argument to product.')
  687.     
  688.     return multiply.reduce(x, axis)
  689.  
  690.  
  691. def sometrue(x, axis = 0):
  692.     '''Perform a logical_or over the given axis.'''
  693.     x = array(x, copy = 0)
  694.     n = len(x.shape)
  695.     if axis < 0:
  696.         axis += n
  697.     
  698.     if n == 0 and axis in [
  699.         0,
  700.         -1]:
  701.         return x[0] != 0
  702.     
  703.     if axis < 0 or axis >= n:
  704.         return (ValueError, 'Improper axis argument to sometrue.')
  705.     
  706.     return logical_or.reduce(x, axis)
  707.  
  708.  
  709. def alltrue(x, axis = 0):
  710.     '''Perform a logical_and over the given axis.'''
  711.     x = array(x, copy = 0)
  712.     n = len(x.shape)
  713.     if axis < 0:
  714.         axis += n
  715.     
  716.     if n == 0 and axis in [
  717.         0,
  718.         -1]:
  719.         return x[0] != 0
  720.     
  721.     if axis < 0 or axis >= n:
  722.         return (ValueError, 'Improper axis argument to product.')
  723.     
  724.     return logical_and.reduce(x, axis)
  725.  
  726.  
  727. def cumsum(x, axis = 0):
  728.     '''Sum the array over the given axis.'''
  729.     x = array(x, copy = 0)
  730.     n = len(x.shape)
  731.     if axis < 0:
  732.         axis += n
  733.     
  734.     if n == 0 and axis in [
  735.         0,
  736.         -1]:
  737.         return x[0]
  738.     
  739.     if axis < 0 or axis >= n:
  740.         return (ValueError, 'Improper axis argument to cumsum.')
  741.     
  742.     return add.accumulate(x, axis)
  743.  
  744.  
  745. def cumproduct(x, axis = 0):
  746.     '''Sum the array over the given axis.'''
  747.     x = array(x, copy = 0)
  748.     n = len(x.shape)
  749.     if axis < 0:
  750.         axis += n
  751.     
  752.     if n == 0 and axis in [
  753.         0,
  754.         -1]:
  755.         return x[0]
  756.     
  757.     if axis < 0 or axis >= n:
  758.         return (ValueError, 'Improper axis argument to cumproduct.')
  759.     
  760.     return multiply.accumulate(x, axis)
  761.  
  762. arange = multiarray.arange
  763.  
  764. def around(m, decimals = 0):
  765.     '''around(m, decimals=0)     Round in the same way as standard python performs rounding. Returns 
  766.     always a float.
  767.     '''
  768.     m = asarray(m)
  769.     s = sign(m)
  770.     if decimals:
  771.         m = absolute(m * 10.0 ** decimals)
  772.     else:
  773.         m = absolute(m)
  774.     rem = m - asarray(m).astype(Int)
  775.     m = where(less(rem, 0.5), floor(m), ceil(m))
  776.     if decimals:
  777.         m = m * s / 10.0 ** decimals
  778.     else:
  779.         m = m * s
  780.     return m
  781.  
  782.  
  783. def sign(m):
  784.     '''sign(m) gives an array with shape of m with elements defined by sign
  785.     function:  where m is less than 0 return -1, where m greater than 0, a=1,
  786.     elsewhere a=0.
  787.     '''
  788.     m = asarray(m)
  789.     return (zeros(shape(m)) - less(m, 0)) + greater(m, 0)
  790.  
  791.  
  792. def allclose(a, b, rtol = 1.0000000000000001e-05, atol = 1e-08):
  793.     ''' allclose(a,b,rtol=1.e-5,atol=1.e-8)
  794.         Returns true if all components of a and b are equal
  795.         subject to given tolerances.
  796.         The relative error rtol must be positive and << 1.0
  797.         The absolute error atol comes into play for those elements
  798.         of y that are very small or zero; it says how small x must be also.
  799.     '''
  800.     x = array(a, copy = 0)
  801.     y = array(b, copy = 0)
  802.     d = less(absolute(x - y), atol + rtol * absolute(y))
  803.     return alltrue(ravel(d))
  804.  
  805.  
  806. def rank(a):
  807.     '''Get the rank of sequence a (the number of dimensions, not a matrix rank)
  808.        The rank of a scalar is zero.
  809.     '''
  810.     return len(shape(a))
  811.  
  812.  
  813. def shape(a):
  814.     '''Get the shape of sequence a'''
  815.     
  816.     try:
  817.         return a.shape
  818.     except:
  819.         return array(a).shape
  820.  
  821.  
  822.  
  823. def size(a, axis = None):
  824.     '''Get the number of elements in sequence a, or along a certain axis.'''
  825.     s = shape(a)
  826.     if axis is None:
  827.         if len(s) == 0:
  828.             return 1
  829.         else:
  830.             return reduce((lambda x, y: x * y), s)
  831.     else:
  832.         return s[axis]
  833.  
  834.  
  835. def average(a, axis = 0, weights = None, returned = 0):
  836.     """average(a, axis=0, weights=None)
  837.        Computes average along indicated axis. 
  838.        If axis is None, average over the entire array.
  839.        Inputs can be integer or floating types; result is type Float.
  840.    
  841.        If weights are given, result is:
  842.            sum(a*weights)/(sum(weights))
  843.        weights must have a's shape or be the 1-d with length the size
  844.        of a in the given axis. Integer weights are converted to Float.
  845.  
  846.        Not supplying weights is equivalent to supply weights that are
  847.        all 1.
  848.  
  849.        If returned, return a tuple: the result and the sum of the weights 
  850.        or count of values. The shape of these two results will be the same.
  851.  
  852.        raises ZeroDivisionError if appropriate when result is scalar.
  853.        (The version in MA does not -- it returns masked values).
  854.     """
  855.     if axis is None:
  856.         a = array(a).flat
  857.         if weights is None:
  858.             n = add.reduce(a)
  859.             d = len(a) * 1.0
  860.         else:
  861.             w = array(weights).flat * 1.0
  862.             n = add.reduce(a * w)
  863.             d = add.reduce(w)
  864.     else:
  865.         a = array(a)
  866.         ash = a.shape
  867.         if ash == ():
  868.             a.shape = (1,)
  869.         
  870.         if weights is None:
  871.             n = add.reduce(a, axis)
  872.             d = ash[axis] * 1.0
  873.             if returned:
  874.                 d = ones(shape(n)) * d
  875.             
  876.         else:
  877.             w = array(weights, copy = 0) * 1.0
  878.             wsh = w.shape
  879.             if wsh == ():
  880.                 wsh = (1,)
  881.             
  882.             if wsh == ash:
  883.                 n = add.reduce(a * w, axis)
  884.                 d = add.reduce(w, axis)
  885.             elif wsh == (ash[axis],):
  886.                 ni = ash[axis]
  887.                 r = [
  888.                     NewAxis] * ni
  889.                 r[axis] = slice(None, None, 1)
  890.                 w1 = eval('w[' + repr(tuple(r)) + ']*ones(ash, Float)')
  891.                 n = add.reduce(a * w1, axis)
  892.                 d = add.reduce(w1, axis)
  893.             else:
  894.                 raise ValueError, 'average: weights wrong shape.'
  895.     if not isinstance(d, ArrayType):
  896.         if d == 0.0:
  897.             raise ZeroDivisionError, 'Numeric.average, zero denominator'
  898.         
  899.     
  900.     if returned:
  901.         return (n / d, d)
  902.     else:
  903.         return n / d
  904.  
  905.